package controller

import (
	"Last/model"
	"Last/utils"
	"crypto/sha256"
	"encoding/hex"
	"fmt"
	"github.com/dgrijalva/jwt-go"
	"github.com/gin-gonic/gin"
	"log"
	"net/http"
	"time"
)

// 与用户有关的控制器，逻辑放在这里
func LoginUser(c *gin.Context) {
	var user model.User
	err := c.BindJSON(&user)
	checkErr(err)
	db := utils.OpenConn()
	defer utils.CloseConn(db)
	//首先查询用户，是否有
	var user1 model.User
	if err := db.Debug().Where("account=?", user.Account).First(&user1).Error; err != nil {
		c.JSON(200, gin.H{
			"code": -2,
			"msg":  "查询数据库失败，用户输入用户名不正确",
			"err":  err.Error(),
		})
		return
	}
	//fmt.Println(user1.Password, user.Password)
	sum := sha256.Sum256([]byte(user.Password))
	user.Password = hex.EncodeToString(sum[:])
	//fmt.Println(user.Password)
	if user.Password != user1.Password {
		c.JSON(200, gin.H{
			"code": -2,
			"msg":  "输入密码不正确",
		})
		return
	} else {
		token := CreateToken(user.Account, user.Password)
		c.JSON(200, gin.H{
			"code":    200,
			"msg":     "密码正确，同意登录",
			"token":   token,
			"account": user.Account,
		})
	}
}

// 注册模块
func RegisterUser(c *gin.Context) {
	var user model.User
	var personal model.Personal
	//数据绑定到结构体
	err := c.BindJSON(&user)
	checkErr(err)
	if user.Cfpassword != user.Password {
		c.JSON(200, gin.H{
			"code":  -3,
			"error": err.Error(),
			"msg":   "两次输入的密码不正确",
		})
		return
	}
	sum := sha256.Sum256([]byte(user.Password))
	user.Password = hex.EncodeToString(sum[:])
	db := utils.OpenConn()
	defer utils.CloseConn(db)
	//创建数据库
	//db.AutoMigrate(&model.User{})
	//应该先在注册的时候进行判断用户名是否重复的提示，首先进行查询语句，然后进行判断
	result := db.Where("account = ?", user.Account).First(&user)
	if result.RowsAffected == 1 {
		c.JSON(200, gin.H{
			"code":    -5,
			"message": "该账户已被注册！",
		})
		return
	}
	if err = db.Create(&user).Error; err != nil {
		c.JSON(200, gin.H{
			"code":  -4,
			"error": err.Error(),
		})
		return
	} else {
		//创建之后加入到个人信息表，相当于初始化信息表
		personal.Account = user.Account
		personal.Unread = 0
		err = db.Create(&personal).Error
		if err != nil {
			c.JSON(200, gin.H{
				"code":  500,
				"error": err.Error(),
			})
			return
		}
		//这里可以直接传入结构体
		c.JSON(200, gin.H{
			"code": 200,
			"msg":  "success",
			"data": user,
		})
	}
}
func NoRouter(c *gin.Context) {
	c.HTML(http.StatusNotFound, "views/404.html", nil)
}
func checkErr(err error) {
	if err != nil {
		log.Fatal(err)
	}
}

// 这个是页面返回数据的接口Cart
func Cart(c *gin.Context) {
	c.JSON(200, gin.H{
		"code": 200,
		"msg":  "success",
	})
}

// 这里退出登录应该要用到redis 这里看要不要考虑加上
func Logout(c *gin.Context) {
	//这里应该删除token
	//tokenString := c.GetHeader("token")
	c.JSON(200, gin.H{
		"code":    200,
		"message": "success",
	})
}

// 生成token
func CreateToken(account string, passworld string) string {
	//秘钥，这个是默认为 HS256（HMAC-SHA256），是一种单项散列函数，加密解密采用同个密钥；
	var jwtkey = []byte("handsome-zjy")
	//过期时间为1天
	expireTime := time.Now().Add(3 * time.Hour)
	claims := &model.Claims{
		Account:  account,
		Password: passworld,
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: expireTime.Unix(), //过期时间
			IssuedAt:  time.Now().Unix(), //颁发时间
			Issuer:    "handsome-zjy",    //签名颁发者
			Subject:   "usser token",     //签名主题
		}}
	tokenString := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	token, err := tokenString.SignedString(jwtkey)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(token)
	return token
}
